USER_FILE=locations.user
include $(USER_FILE)

#compiler
CC=g++
LINKER=g++

PREPROC+= $(USER_PREPROC)
CFLAGS = -Wall -g $(BOOST_INC_FLAGS) $(GSL_INC_FLAGS)
LINKFLAGS = -g -lm $(BOOST_LIB_FLAGS) $(GSL_LIB_FLAGS) 

ifeq ($(use_gpu),1)
	PREPROC+=-DUSE_GPU
	CFLAGS+=$(OPENCL_INC_FLAGS)
	LINKFLAGS+=$(OPENCL_LIB_FLAGS)
	OPENCL_OBS=cl_interface.o clsafe.o
endif

ifeq ($(use_mpi),1)
	PREPROC+=-DUSE_MPI
	CC = mpic++
	LINKER = mpic++
	OPENCL_OBS=
	MPI_DIR=mpi/
endif

ifeq ($(profiling),1)
	CFLAGS+= -pg
	LINKFLAGS+= -pg
endif

OBJS=ccode.o experiment.o fly.o listelement.o petridish.o smc.o $(OPENCL_OBS) $(MPI_OBS)
PROGRAM=../bin/flysim

$(PROGRAM): $(OBJS)
	$(LINKER) -o $(PROGRAM) $(OBJS) $(LINKFLAGS)

ccode.o: ccode.cpp flysim.h $(USER_FILE)
	$(CC) $(CFLAGS) $(PREPROC) -o ccode.o -c $<

experiment.o: $(MPI_DIR)experiment.cpp flysim.h $(USER_FILE)
	$(CC) $(CFLAGS) $(PREPROC) -o experiment.o -c $<

listelement.o: listelement.cpp flysim.h $(USER_FILE)
	$(CC) $(CFLAGS) $(PREPROC) -o listelement.o -c $<

linkedlist.o: linkedlist.cpp flysim.h
	$(CC) $(CFLAGS) $(PREPROC) -o linkedlist.o -c $<

petridish.o: petridish.cpp flysim.h $(USER_FILE)
	$(CC) $(CFLAGS) $(PREPROC) -o petridish.o -c $<

config.o: config.cpp flysim.h
	$(CC) $(CFLAGS) $(PREPROC) -o config.o -c $<

fly.o: fly.cpp flysim.h $(USER_FILE)
	$(CC) $(CFLAGS) $(PREPROC) -o fly.o -c $<

smc.o: $(MPI_DIR)SMC.cpp flysim.h $(USER_FILE)
	$(CC) $(CFLAGS) $(PREPROC) -o smc.o -c $<

flysim.o: flysim.cpp flysim.h
	$(CC) $(CFLAGS) $(PREPROC) -o flysim.o -c $<

userintf.o: userintf.cpp
	$(CC) $(CFLAGS) $(PREPROC) -o userintf.o -c $<

cl_interface.o: opencl/cl_interface.cpp opencl/cl_interface.h
	$(CC) $(CFLAGS) $(PREPROC) -o cl_interface.o -c $<

clsafe.o: opencl/clsafe.c opencl/clsafe.h
	$(CC) $(CFLAGS) $(PREPROC) -o clsafe.o -c $<

hello_mpi: mpi/hello_mpi.cpp
	$(CC) $(CFLAGS) $(PREPROC) -o ../bin/hello_mpi $<

clean :
	rm -fr *.o $(PROGRAM) ../bin/hello_mpi
